package controller;

import java.util.*;

/**
 * @author Mr.gao
 * @date 2021/5/7 16:13
 **/
public class FightTest {
    public static void main(String[] args) {

        /**
         * 使用集合实现斗地主游戏的部分功能，要求如下：
         *  （1）首先准备 54 张扑克牌并打乱顺序。
         *  （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
         *  （3）查看三个玩家手中的扑克牌和底牌。
         *  （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
         *      手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
         */
        //定义一个存储牌面的集合
        Map<Integer, String> map = new HashMap<>();
        //定义牌面数字和花色的数组
        String[] pokerNum = new String[]{"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        String[] pokerCol = new String[]{"红桃","黑桃","草花","方块"};

        //通过遍历进行扑克的组装，
        int index = 3;
        map.put(1,"大王");
        map.put(2,"小王");
        for (String num:pokerNum) {
            for (String col:pokerCol) {
                map.put(index,col+num);
                index++;
            }
        }
        //定义一个存储牌面的下标的集合
        List<Integer> list = new ArrayList();

        //获取所有的key存储到list集合中
        Set<Integer> integers = map.keySet();
        for (Integer key:integers) {
            list.add(key);
        }
        //利用shuffle方法进行打乱顺序
        Collections.shuffle(list);

        // 玩家一
        List<Integer> player1 = new ArrayList<Integer>();
        // 玩家二
        List<Integer> player2 = new ArrayList<Integer>();
        // 玩家三
        List<Integer> player3 = new ArrayList<Integer>();
        // 底牌
        List<Integer> finalCards = new ArrayList<Integer>();


        //通过判断进行给玩家发牌将map集合的key也就是list集合的值分别存储在三个玩家的集合中
        for (int i = 0; i < list.size(); i++) {
           if(i < list.size()-3){
               if(i % 3 == 0){
                   player1.add(list.get(i));
               }else if(i % 3 == 1){
                   player2.add(list.get(i));
               }else if(i % 3 == 2){
                   player3.add(list.get(i));
               }
           }else {
               finalCards.add(list.get(i));
           }
        }
      //将玩家和底牌进行排序
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        Collections.sort(finalCards);

        //map.get(player1.get(i)) 即利用key值从map集合中获取牌面和花色，并打印

        System.out.println("玩家一");
        for (int i = 0; i < player1.size(); i++) {
            System.out.print(map.get(player1.get(i))+"\t");
        }
        System.out.println();
        System.out.println("玩家二");
        for (int i = 0; i < player2.size(); i++) {
            System.out.print(map.get(player2.get(i))+"\t");
        }
        System.out.println();
        System.out.println("玩家三");
        for (int i = 0; i < player3.size(); i++) {
            System.out.print(map.get(player3.get(i))+"\t");
        }
        System.out.println();
        System.out.println("底牌");
        for (int i = 0; i < finalCards.size(); i++) {
            System.out.print(map.get(finalCards.get(i))+"\t");
        }
    }
}
